﻿using NHibernate;
using NHibernate.Cfg;
using Search4.Domain.Entity;
using System;
using System.Linq;
using NHibernate;
using NHibernate.Linq;
using System.Collections.Generic;

namespace Search4.Domain.Repository
{
    public class EstabelecimentoRepository
    {
        private ISessionFactory sessionFactory = new Configuration()
                        .Configure()
                        .BuildSessionFactory();

        public void Salvar(Estabelecimento estabelecimento)
        {
            using (var session = sessionFactory.OpenSession())
            {
                session.BeginTransaction();
                try
                {
                    session.SaveOrUpdate(estabelecimento);
                    session.Transaction.Commit();
                    session.Flush();
                }
                catch
                {
                    throw;
                }
            }
        }

        public void Excluir(Estabelecimento estabelecimento)
        {
            using (var session = sessionFactory.OpenSession())
            {
                session.BeginTransaction();
                try
                {
                    session.Delete(estabelecimento);
                    session.Transaction.Commit();
                }
                catch
                {
                    throw;
                }
            }
        }

        public List<Estabelecimento> ObterPeloUsuario(Int32 IdUsuario)
        {
            using (var session = sessionFactory.OpenSession())
            {
                return (from e in session.Query<Estabelecimento>()
                        where e.Usuario.IdUsuario == IdUsuario
                        select e).ToList();
            }
        }

        public Estabelecimento ObterPeloIdentificador(Int32 id)
        {
            using (var session = sessionFactory.OpenSession())
            {
                return session.Get<Estabelecimento>(id);
            }
        }

        public List<Estabelecimento> ObterPorQualquerCoisa(String parametros)
        {
            using (var session = sessionFactory.OpenSession())
            {
                return (from e in session.Query<Estabelecimento>()
                        where e.Nome.Contains(parametros) ||
                              e.Descricao.Contains(parametros) ||
                              e.RazaoSocial.Contains(parametros) ||
                              e.Segmento.Contains(parametros) ||
                              e.Telefone.Contains(parametros) ||
                              e.Endereco.Bairro.Contains(parametros) ||
                              e.Endereco.Cidade.Contains(parametros) ||
                              e.Endereco.Complemento.Contains(parametros) ||
                              e.Endereco.Logradouro.Contains(parametros) ||
                              e.Endereco.Numero.Contains(parametros)
                        select e).ToList();
            }
        }

        public List<Estabelecimento> ObterOsTresUltimosCadastrados()
        {
            using (var session = sessionFactory.OpenSession())
            {
                return (session.Query<Estabelecimento>().OrderByDescending(e => e.IdEstabelecimento).Take(3)).ToList();
            }
        }

        public List<Estabelecimento> ObterPorCategoria(String categoria)
        {
            using (var session = sessionFactory.OpenSession())
            {
                return (from e in session.Query<Estabelecimento>()
                        where e.Segmento == categoria
                        select e).ToList();
            }
        }

        public List<Estabelecimento> ObterEstabelecimentosRandomicos()
        {
            using (var session = sessionFactory.OpenSession())
            {
                var estabelecimentos = (from e in session.Query<Estabelecimento>() select e).ToList();
                var estabelecimentosRandomicos = new List<Estabelecimento>();

                for (int i = 0; i < 3; i++)
                {
                    var rand = new Random();
                    var elemento = estabelecimentos[rand.Next(estabelecimentos.Count)];
                    estabelecimentosRandomicos.Add(elemento);

                    Int32 cont = 0;
                    for (int j = 0; j < estabelecimentosRandomicos.Count; j++)
                    {
                        if (elemento.IdEstabelecimento == estabelecimentosRandomicos[j].IdEstabelecimento)
                        {
                            cont++;
                        }

                        if (cont > 1)
                        {
                            estabelecimentosRandomicos.Remove(elemento);
                            i--;
                        }
                    }   
                }

                return estabelecimentosRandomicos;
            }
        }
    }
}

